home *** CD-ROM | disk | FTP | other *** search
- #include <stdio.h>
- #include <string.h>
- #include <io.h>
- #include <time.h>
- #include <alloc.h>
- #include <stdlib.h>
-
-
- struct entries {
- char *name;
- int index;
- };
-
- extern char *skipwhite (char *cp);
- struct entries *e;
- static int current, count;
- static char name[16];
- static int start, result, index, same;
- int sortdups, wassorted, expired;
-
- static void
- search ()
- {
- int k;
-
- same = 0;
- for (index = 0; index < count; index++) {
- result = stricmp (name, e[index].name);
- if (!result) {
- same = 1;
- sortdups++;
- return;
- }
- if (result < 0)
- return;
- }
- return;
- }
-
-
- static void
- insert ()
- {
- unsigned k;
-
- for (k = count; k > index; k--) {
- strcpy (e[k].name, e[k - 1].name);
- e[k].index = e[k - 1].index;
- }
- strcpy (e[k].name, name);
- #ifdef TEST
- if (count)
- printf ("inserting at %d - %s -> %s\n", k, e[k].name, e[k + 1].name);
- else
- printf ("inserting 1st record %s\n", e[k].name);
- #endif
- if (!wassorted && !same && current != index)
- wassorted = 1;
- if (!same)
- e[k].index = current;
- else
- e[k].index = -1;
- current++;
- count++;
- }
-
-
- static void
- makesortname (buf, origname)
- char *buf, *origname;
- {
- char *cp;
-
- strcpy (buf, origname);
- cp = strchr (buf, '.');
- if (!cp)
- cp = &buf[strlen(buf)];
- strcpy (cp, ".srt");
- }
-
- void
- sortit (fname, entrysize, searchsize, strsize, date)
- char *fname;
- int entrysize, searchsize, strsize;
- time_t date;
- {
- char *cp;
- unsigned k;
- FILE *fp, *out;
- char buf[128];
- long size;
- int num;
- time_t now, stamptime;
-
- #ifdef TEST
- printf ("Filename: '%s', Entrysize=%d, Searchsize=%d\n", fname, entrysize, searchsize);
- #endif
- if ((fp = fopen (fname, "rt")) == 0) {
- #ifdef TEST
- printf ("can't open input file: %s\n", fname);
- #endif
- return;
- }
- makesortname (buf, fname);
- if ((out = fopen (buf, "wt")) == 0) {
- #ifdef TEST
- printf ("can't open output file: %s\n", buf);
- #endif
- fclose (fp);
- return;
- }
- size = filelength(fileno(fp));
- size /= (long) entrysize;
- size += 1;
- #ifdef TEST
- printf ("%ld Entries found - Allocating structure...\n", size - 1);
- #endif
- e = (struct entries *) malloc (size * sizeof(struct entries));
- for (current = 0; current < size; current++) {
- e[current].name = (char *)malloc (searchsize + 1);
- e[current].name[0] = 0;
- e[current].index = -1;
- }
- current = count = 0;
- expired = sortdups = wassorted = 0;
- now = time(&now);
- while (!feof (fp)) {
- pwait (NULL);
- fgets (buf, entrysize, fp);
- #ifdef TEST
- printf ("Reading Entry %d/%d - ", current, count);
- #endif
- if (feof (fp))
- continue;
- strncpy (name, buf, searchsize);
- name[searchsize] = 0;
- if ((cp = strpbrk (name, ".@ \t")) != 0)
- *cp = 0;
- search();
- insert ();
-
- /* if invalid character at beginning, mark as bad */
- if (*buf < ' ' || *buf == '$')
- e[index].index = -2;
- else {
- /* now check for expired date stamp, if used */
- if (date) {
- cp = strchr (buf, ' ');
- cp = skipwhite (cp);
- stamptime = atol(cp);
- if ((stamptime == 0) || (now - stamptime >= date)) {
- #ifdef TEST
- printf ("Expiring: now=%ld, age=%ld, stamptime=%ld\n", now, date, stamptime);
- #endif
- expired++;
- e[index].index = -2;
- }
- }
- }
- }
- #ifdef TEST
- putchar ('\n');
- #endif
- fflush (stdout);
- if (expired || wassorted || sortdups) {
- for (k = 0; k < count; k++) {
- if (e[k].index >= 0) {
- #ifdef TEST
- printf ("Outputing record %d/%d\n", k, count);
- #endif
- pwait (NULL);
- fseek (fp, (long) ((long)e[k].index * (long)entrysize), 0);
- fgets (buf, entrysize, fp);
-
- if (strsize) {
- /* we now re-format it, just in case it is bad */
- if ((cp = strpbrk (buf, " \t")) != 0)
- *cp++ = 0;
- cp = skipwhite (cp);
- stamptime = atol(cp);
- fprintf(out,"%-*s %-14ld\n",strsize,buf,stamptime);
- } else
- fputs (buf, out);
- }
- #ifdef TEST
- else if (e[k].index == -2)
- printf ("Expiring record %d/%d\n", k, count);
- else printf ("Skipping record %d/%d\n", k, count);
- #endif
-
- }
- }
-
- fclose (fp);
- fclose (out);
- for (current = 0; current < size; current++)
- free(e[current].name);
- free (e);
- makesortname (buf, fname);
- if (expired || wassorted || sortdups) {
- remove (fname);
- rename (buf, fname);
- } else
- remove (buf);
- }
-
-
-
-
- #ifdef DEMO
- #define ENTRYSIZE 49
-
- int
- pwait (i)
- int i;
- {
- return i;
- }
-
-
- char *
- skipwhite (cp)
- char *cp;
- {
- while (*cp && (*cp == ' ' || *cp == '\t'))
- cp++;
- return (cp);
- }
-
-
- void
- main (argc, argv)
- int argc;
- char *argv[];
- {
- unsigned long begincore;
-
- begincore = coreleft();
- if (argc == 1)
- sortit ("/nos/spool/wpagebbs", ENTRYSIZE, 6, 0, (time_t)0);
- else
- sortit (argv[1], atoi (argv[2]), atoi(argv[3]), 0, (time_t) 0);
- printf ("\nBeginning coreleft was %ld - Now is %ld\n", begincore, (long) coreleft());
- if (!wassorted && !sortdups)
- printf ("File was already sorted with no duplicates...\nNo further action needed\n");
- else if (sortdups)
- printf ("%d duplicates removed\n", sortdups);
- }
- #endif
-